﻿using System;
using System.Web;
using BO;
using Business;
using Entity;
using Entity.Custom;
using Newtonsoft.Json;
using Utilities;

namespace FreshCms.BackEnd.Handler
{
    /// <summary>
    /// Summary description for Product
    /// </summary>
    public class Product : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {

        #region Declare variable for check pms
        Int32 ui = 0;
        InPms chkPms = new InPms();
        InUser CurrentUser = new InUser();
        #endregion

        public void ProcessRequest(HttpContext context)
        {
            string m = "";
            var response = new ResponseData();

            #region Get PanelId and Check Psm
            CurrentUser = InUserBusiness.GetSessionInUser();
            if (!string.IsNullOrEmpty(context.Request["ui"]))
            {
                Int32.TryParse(context.Request["ui"], out ui);
                if (ui > 0)
                    chkPms = InPmsBusiness.CheckSessionPms(ui);
                if (chkPms == null)
                    chkPms = new InPms { PmsView = 0, PmsUpdate = 0, PmsDelete = 0 };
            }
            #endregion



            if (context.Request.RequestType == "POST")
            {
                if (context.Request["m"] != null)
                    m = context.Request["m"];
                else
                    return;
            }
            else
            {
                if (context.Request.QueryString["m"] != null)
                    m = context.Request.QueryString["m"];
                else
                    return;
            }

            switch (m.ToLower())
            {
                case "add":
                    response = AddProduct(context);
                    break;
                case "updatefast":
                    response = UpdateFastProduct(context);
                    break;
                case "delete":
                    response = DeleteProduct(context);
                    break;
                case "recycle":
                    response = RecycleProduct(context);
                    break;
                case "recover":
                    response = RecoverProduct(context);
                    break;
                case "getlistforbox":
                    response = GetListProductForBox(context);
                    break;
                    
            }

            context.Response.ContentType = "application/x-javascript";

            string callBack = context.Request["callback"];
            if (!string.IsNullOrEmpty(callBack))
            {
                context.Response.Write(callBack + "( " + JsonConvert.SerializeObject(response) + " );");
            }
            else
                context.Response.Write(JsonConvert.SerializeObject(response));
        }

        private ResponseData GetListProductForBox(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsView == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoView, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["procate"])
                && !string.IsNullOrEmpty(context.Request["isparent"]))
            {
                string name = "";
                Int32 cate = 0;
                bool isParent = false;

                name = context.Request["proname"];
                Int32 temp = 0;
                Int32.TryParse(context.Request["isparent"], out temp);
                Int32.TryParse(context.Request["procate"], out cate);
                if (temp == 1)// neu la cate cha
                    isParent = true;
                Int32 total = 0;
                var lst = OutProductBusiness.GetOutProductListByPaging(isParent, name, "", cate, 1, 1, 50, ref total);
                if (lst.Count > 0)
                {
                    response.Data = lst;
                    response.Message = "Lấy thành công, có " + total + " sản phẩm phù hợp";
                    response.Success = true;
                    response.Total = total;
                }
                else
                {
                    response.Data = -1;
                    response.Message = "Không có dữ liệu phù hợp !";
                    response.Success = false;
                    response.Total = total;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Bạn chưa nhập tên sản phẩm cần tìm kiếm !";
                response.Success = false;
            }

            return response;
        }

        private ResponseData AddProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["detail1"])
                && !string.IsNullOrEmpty(context.Request["name"])
                && !string.IsNullOrEmpty(context.Request["code"])
                && !string.IsNullOrEmpty(context.Request["newprice"])
                && !string.IsNullOrEmpty(context.Request["avatar"])
                && !string.IsNullOrEmpty(context.Request["cateid"])
                && !string.IsNullOrEmpty(context.Request["listonchild"])
                && !string.IsNullOrEmpty(context.Request["listonparent"])
                && !string.IsNullOrEmpty(context.Request["desc"])
                && !string.IsNullOrEmpty(context.Request["stt"]))
            {
                string detail1, name, code, listonChild, listonParent, desc, ava, promotion = "";
                double newprice = 0;
                double oldprice = 0;
                Int32 stt = 0;
                Int32 cate = 0;
                Int32 id = 0;
                byte isHot = 0;
                byte isNew = 0;
                byte isStock = 0;
                Int32 isChangeListon = 0;

                detail1 = context.Request["detail1"];
                name = context.Request["name"];
                code = context.Request["code"];
                listonChild = context.Request["listonchild"];
                listonParent = context.Request["listonparent"];
                desc = context.Request["desc"];
                ava = context.Request["avatar"];
                double.TryParse(context.Request["newprice"], out newprice);
                Int32.TryParse(context.Request["cateid"], out cate);
                if (!string.IsNullOrEmpty(context.Request["id"]))
                    Int32.TryParse(context.Request["id"], out id);
                if (!string.IsNullOrEmpty(context.Request["promotion"]))
                    promotion = context.Request["promotion"];
                if (!string.IsNullOrEmpty(context.Request["oldprice"]))
                    double.TryParse(context.Request["oldprice"], out oldprice);
                if (!string.IsNullOrEmpty(context.Request["stt"]))
                    Int32.TryParse(context.Request["stt"], out stt);
                if (!string.IsNullOrEmpty(context.Request["ishot"]))
                    byte.TryParse(context.Request["ishot"], out isHot);
                if (!string.IsNullOrEmpty(context.Request["isnew"]))
                    byte.TryParse(context.Request["isnew"], out isNew);
                if (!string.IsNullOrEmpty(context.Request["isstock"]))
                    byte.TryParse(context.Request["isstock"], out isStock);
                if (!string.IsNullOrEmpty(context.Request["isUpdateListon"]))
                    Int32.TryParse(context.Request["isUpdateListon"], out isChangeListon);

                var obj = new OutProduct()
                {
                    ProId = id,
                    CatId = cate,
                    ProName = name,
                    ProCode = code,
                    ProDesc = desc,
                    ProDetail1 = detail1,
                    ProDetail2 = "",
                    ProDetail3 = "",
                    ProImage1 = ava,
                    ProImage2 = "",
                    ProImage3 = "",
                    ProImage4 = "",
                    ProPublishDate = DateTime.Now,
                    ProOldPrice = oldprice,
                    ProNewPrice = newprice,
                    ProHot = isHot,
                    ProNew = isNew,
                    ProStatus = stt,
                    ProIsStock = isStock,
                    ProPromotion = promotion,
                    UserId = CurrentUser.UserId

                };

                // ID>0 là UPDATE
                if (id > 0)
                {
                    #region UPDATE sản phẩm

                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if(CurrentUser.IsSuperAdmin==1)
                        returnVal = OutProductBusiness.UpdateOutProduct(obj);
                    else
                        returnVal = OutProductBusiness.UpdateOutProductWithRole(obj);
                    // UPDATE thanh cong
                    if(returnVal>-1)
                    {
                        response.Data = returnVal;
                        response.Success = true;

                        // Sau khi UPDATE thành công, check xem có phải update liston không?
                        if (isChangeListon==1)
                        {
                            response.Message = "Call Update OK With change ListOn";
                            // Trước khi update liston thì xóa hết liston cũa của sản phẩm đi
                            OutProductListOnBusiness.DeleteOutProductListOnByProId(id);
                            // Insert ListOn cho Cate Child
                            var childs = listonChild.Split(',');
                            var objlo = new OutProductListOn();
                            foreach (var cateid in childs)
                            {
                                Int32 childId = 0;
                                Int32.TryParse(cateid, out childId);
                                if (childId > 0)
                                {
                                    objlo.CatId = childId;
                                    objlo.IsParent = 0;
                                    objlo.ProId = id;
                                    objlo.ListonId = 0;
                                    OutProductListOnBusiness.InsertOutProductListOn(objlo);
                                }
                            }

                            // Insert ListOn cho Cate Parent
                            var parents = listonParent.Split(',');
                            foreach (var cateid in parents)
                            {
                                Int32 parentId = 0;
                                Int32.TryParse(cateid, out parentId);
                                if (parentId > 0)
                                {
                                    objlo.CatId = parentId;
                                    objlo.IsParent = 1;
                                    objlo.ProId = id;
                                    objlo.ListonId = 0;
                                    OutProductListOnBusiness.InsertOutProductListOn(objlo);
                                }
                            }
                        }
                        else
                            response.Message = "Call Update OK, ListOn don't CHANGE";

                        // Ghi log hệ thống
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 2,
                            Field1 = "Update thông tin sản phẩm thành công",
                            Field2 = "Sản phẩm thay đổi thông tin: " + name + " (ID: " + id + ")",
                            Field3 = "",
                            LogId = 0
                        });    

                    }else
                    {
                        response.Data = returnVal;
                        response.Message = "Sản phẩm này không do bạn tạo ra. Bạn không có quyền chỉnh sửa sản phẩm này.";
                        response.Success = false;
                    }
                    #endregion
                }
                else // INSERT sản phẩm
                {
                    #region INSERT sản phẩm
                    var idProReturn = OutProductBusiness.InsertOutProduct(obj);

                    if(idProReturn>0) // Nếu Insert thành công thì Insert bảng ListOn
                    {
                        // Insert ListOn cho Cate Child
                        var childs = listonChild.Split(',');
                        var objlo = new OutProductListOn();
	                    foreach (var cateid in childs)
	                    {
	                        Int32 childId = 0;
	                        Int32.TryParse(cateid, out childId);
	                        if (childId > 0)
	                        {
	                            objlo.CatId = childId;
	                            objlo.IsParent = 0;
	                            objlo.ProId = idProReturn;
	                            objlo.ListonId = 0;
	                            OutProductListOnBusiness.InsertOutProductListOn(objlo);
	                        }
	                    }

                        // Insert ListOn cho Cate Parent
                        var parents = listonParent.Split(',');
	                    foreach (var cateid in parents)
	                    {
	                        Int32 parentId = 0;
	                        Int32.TryParse(cateid, out parentId);
                            if(parentId>0)
                            {
                                objlo.CatId = parentId;
                                objlo.IsParent = 1;
                                objlo.ProId = idProReturn;
                                objlo.ListonId = 0;
                                OutProductListOnBusiness.InsertOutProductListOn(objlo);
                            }
	                    }
                                                     
                    }

                    response.Data = idProReturn;
                    response.Message = "Call Insert OK";
                    response.Success = true;

                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 1,
                        Field1 = "Thêm sản phẩm thành công",
                        Field2 = "Tên sản phẩm mới: " + name,
                        Field3 = "",
                        LogId = 0
                    });
                    #endregion
                }
                
            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData UpdateFastProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["id"])
                && !string.IsNullOrEmpty(context.Request["name"])
                && !string.IsNullOrEmpty(context.Request["code"])
                && !string.IsNullOrEmpty(context.Request["price"])
                && !string.IsNullOrEmpty(context.Request["stt"]))
            {
                string name, code = "";
                double newprice = 0;
                Int32 stt = 0;
                Int32 id = 0;

                name = context.Request["name"];
                code = context.Request["code"];
                double.TryParse(context.Request["price"], out newprice);
                Int32.TryParse(context.Request["id"], out id);
                Int32.TryParse(context.Request["stt"], out stt);
                
                var obj = new OutProduct()
                {
                    ProId = id,
                    ProName = name,
                    ProCode = code,
                    ProNewPrice = newprice,
                    ProStatus = stt,
                    UserId = CurrentUser.UserId
                };

                // ID>0 là UPDATE
                if (id > 0)
                {
                    #region UPDATE sản phẩm

                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutProductBusiness.UpdateOutProduct_Fast(obj);
                    else
                        returnVal = OutProductBusiness.UpdateOutProductWithRole_Fast(obj);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call FAST Update OK";

                        // Ghi log hệ thống
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 2,
                            Field1 = "Update nhanh thông tin sản phẩm thành công",
                            Field2 = "Sản phẩm thay đổi thông tin: " + name + " (ID: " + id + ")",
                            Field3 = "Giá mới: " + newprice.ToString(),
                            LogId = 0
                        });

                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Sản phẩm này không do bạn tạo ra. Bạn không có quyền chỉnh sửa sản phẩm này.";
                        response.Success = false;
                    }
                    #endregion
                }
                else 
                {
                    response.Data = id;
                    response.Message = "ProductID <=0";
                    response.Success = false;
                }

            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData DeleteProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string name = context.Request["name"];
                if (id > 0)
                {
                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutProductBusiness.DeleteOutProduct(id);
                    else
                        returnVal = OutProductBusiness.DeleteOutProductWithRole(id, CurrentUser.UserId);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Delete OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 0,
                            Field1 = "Xóa vĩnh viễn sản phẩm thành công",
                            Field2 = "Tên sản phẩm: " + name,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Sản phẩm này không do bạn tạo ra. Bạn không có quyền Xóa Vĩnh Viễn sản phẩm này.";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        private ResponseData RecycleProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string name = context.Request["name"];
                if (id > 0)
                {
                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutProductBusiness.UpdateOutProductStatus(id, -1);
                    else
                        returnVal = OutProductBusiness.UpdateOutProductStatusWithRole(id, -1, CurrentUser.UserId);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Recycle OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 0,
                            Field1 = "Xóa tạm thời sản phẩm thành công",
                            Field2 = "Tên sản phẩm: " + name,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Sản phẩm này không do bạn tạo ra. Bạn không có quyền Xóa Tạm Thời sản phẩm này.";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        private ResponseData RecoverProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string name = context.Request["name"];
                if (id > 0)
                {
                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutProductBusiness.UpdateOutProductStatus(id, 0);
                    else
                        returnVal = OutProductBusiness.UpdateOutProductStatusWithRole(id, 0, CurrentUser.UserId);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Recover OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 3,
                            Field1 = "Phục hồi sản phẩm thành công",
                            Field2 = "Tên sản phẩm: " + name,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Sản phẩm này không do bạn tạo ra. Bạn không có quyền Phục Hồi sản phẩm này.";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}